#include <stdio.h>
#include <string.h>

void function(int a[3])
void function(int a[ ])
void function(int  *a ) // 最终形式
{

}

int main(int argc, char const *argv[])
{
    // 数组出现在表达式中时，会被系统转化为一个指向其首元素的指针
    // 例外：除了sizeof、取址符之外，数组还是数组，不会被转换

    // 数组下标的本质：a[i] 等价于 *(a+i)

    int a[3]; // a[0] - a[2]
    int *k = a;   // p --> a[0]
    k+1; // 跳过4个字节
    // p = a+1;  // p --> a[1]
    printf("%ld\n", sizeof(a)); // 12

    int (*p) [3] =  &a; // p --> a，此处&a代表整个数组（12个字节）的首地址
    p+1; // 跳过12个字节

    function(a);      // 
    function(&a[0]); // 
    //                    b[0]            b[1]             b[2]
    int b[3][5] = {  {1,2,3,4,5}  , {11,22,33,44,55},  {6,7,8,9,10}  };
    printf("%p\n", &b[2][3]);

    printf("%p\n", &b[2][0]);
    printf("%p\n",  b[2]   );

    printf("%p\n", &b[0][0]); // b[0][0]的地址
    printf("%p\n",  b[0]   ); // b[0][0]的地址
    printf("%p\n",  *b     ); // b[0][0]的地址

    printf("%p\n",  b      ); // b[0]整个数组的地址
    printf("%p\n", &b[0]   ); // b[0]整个数组的地址

}

    // int age[200]; // 同时一次性定义n个相同类型的变量

    // 1. 定义、初始化
    // int a[3];
    // int b[3] = {1, 2, 3};

    // a = b;
    // memcpy(a, b, sizeof(int)*3);

    // int b[ ] = {1, 2, 3};
    // int b[ ];
    // int b[3] = {1, 2};
    // int b[3] = {1, 2, 3, 4}; // 错误，越界！！！

    // // 2. 元素引用（0 ~ N-1）
    // a[0] = 4;
    // a[1] = 5;
    // a[2] = 6;
    // printf("a: %d %d %d\n", a[0], a[1], a[2]);
    // memcpy(a, b, sizeof(int)*3);
    // printf("a: %d %d %d\n", a[0], a[1], a[2]);

    // // 3. 字符数组
    // char s1[5];
    // char s2[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; // s2存储的不是字符串
    // char s2[5] = {'a', 'b', 'c', 'd', 'e'}; // s2存储的不是字符串
    // printf("%s\n", s2); // abcde
    // char s3[5] = {"abcde"};
    // char s4[5] =  "abcd" ;

    // // 4. 多维数组
    // int w[2] = {1,2};

    // // char     c[3]   = { 'a', 'b', 'c' };
    // // int      c[3]   = { 1, 2, 3 };

    // int      c[ ][2]= {   {1,2}  ,  {2,3}  ,  {4,5}  };
    // // int      c[ ][2]= {   {1,2}  ,  {2,3}  };
    // // int      c[ ][2]= {   {1,2}  ,  {2,3}  , {4,5}  , [5, 6]};
    // printf("%d\n", c[0][0]);
    // printf("%d\n", c[0][1]);

    // printf("%d\n", c[1][0]);
    // printf("%d\n", c[1][1]);

    // printf("%d\n", c[2][0]);
    // printf("%d\n", c[2][1]);


    // int   a[4];             // 整型数组，第2部分：a[4]; 第1部分：int
    // int   b[3]  [4];        // 二维整型数组，第2部分：b[3]; 第1部分：int [4]
    // int   c[2]  [3][4];     // 第2部分：c[2]; 第1部分：int [3][4]
    // int  *d[6];             // 第2部分：d[6]; 第1部分：int *
    // int (*e[7])(int, char); // 第2部分：e[7]; 第1部分：int (*)(int, float)


//     int a;
//     int a;
//     int a;
//     int a;
//     int a;
//     int A[5] = {   [3]=4, [4]=5};

//     A[0] = 1;

//     int b[3];
//     int b[3];
//     int b[3];
//     int b[3];
//     int b[3];
//     int b[3];
//     int b[3];
//     int b[3];
//     int b[3];
//     int b[3];
//     int  [3];

//     int    (B[100])  [3] = {  {1,2,3},   {2,3,4},  .....   };


//     int  (B[5])  [3] = {     [4]={1,2,3} };
//     B[4][0] = 1;
//     B[4][1] = 2;
//     B[4][2] = 3;


// <<<<<<< HEAD
//     char *p;
//     char *p;
//     char *p;
//     char *p;
//     char *p;
//     char * (P[5]);  // |*|*|*|*|*|

//     int (*k)(char, float);  // ---->   int f(char , float);
//     int (*k)(char, float);
//     int (*k)(char, float);
//     int (*k)(char, float);
//     int (*k)(char, float);
//     int (* )(char, float);
//     int (*   (K[100])   )(char, float);
//     K[0] = f;
// =======
//     // char *p;
//     // char *p;
//     // char *p;
//     // char *p;
//     // char *p;
//     // char * (P[5]);  // |*|*|*|*|*|

//     // int (*k)(char, float);  // ---->   int f(char , float);
//     // int (*k)(char, float);
//     // int (*k)(char, float);
//     // int (*k)(char, float);
//     // int (*k)(char, float);
//     // int (* )(char, float);
//     // int (*   (K[100])   )(char, float);
//     // K[0] = f;


// >>>>>>> 4bd8564166719b188950dd5180be0bb7cec26ce6
    
//     return 0;
// }

// int f(char , float)
// {
//     // ..
// }